﻿// B. M-arrays.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
https://codeforces.com/problemset/problem/1497/B

给你一个数组 a1，a2，...，an，它由 n 个正整数和一个正整数 m 组成。

你应该将这个数组的元素分成几个数组。新数组中的元素可以按顺序排列。

如果数组中每相邻的两个数（i 和 i+1 位置上的两个数，每 i 相邻，称为相邻数）的和都能被 m 整除，那么我们就称这个数组为 m 可分数组。

求 a1、a2......、an 可以分割成的 m 个可分割数组的最小个数。

输入
第一行包含一个整数 t（1≤t≤1000）--测试用例数。

每个测试用例的第一行包含两个整数 n、m（1≤n≤105,1≤m≤105）。
每个测试用例的第二行包含 n 个整数 a1,a2,...,an（1≤ai≤109）。

保证所有测试用例的 n 和 m 之和不超过 105。

输出
为每个测试用例打印问题答案。

InputCopy
4
6 4
2 2 8 6 9 4
10 8
1 1 1 5 2 4 4 8 6 7
1 1
666
2 2
2 4
OutputCopy
3
6
1
1



4
10 8
1 1 1 5 2 4 4 8 6 7


注释
在第一个测试案例中，我们可以将元素划分如下：
[4,8]. 这是一个 4 可分数组，因为 4+8 可以被 4 整除。
[2,6,2]. 这是一个四等分数组，因为 2+6 和 6+2 都能被 4 整除。
[9]. 它是一个四元数组，因为它由一个元素组成。

*/
#include <iostream>
#include <cstring>
#include <unordered_map>

using namespace std;


const int N = 100010;
int a[N];
int n, m ,T;


void solve() {
	cin >> n >> m;
	unordered_map<int, int> mm;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[i] %= m;
		mm[a[i]]++;
	}
	int ans = 0;
	for (int i = 1; i <= n; i++) {
		int x = mm[a[i]]; int y = mm[m - a[i]];
		if (x == 0 && y == 0) {
			continue;
		}
		else if (a[i]==0 || m-a[i]==a[i]) {
			mm[a[i]] = 0;
			ans++;
		}
		else {
			ans += max(1, abs(x-y));
			mm[a[i]] = 0; mm[m - a[i]] = 0;
		}
	}

	cout << ans << endl;
}


int main()
{
	cin >> T;
	while (T--) {
		solve();
	}

	return 0;
}

 